혼잡 제어
1. 개요
1. 개요
혼잡 제어는 컴퓨터 네트워크에서 네트워크 혼잡을 감지하고, 데이터 전송 속도를 조절하여 혼잡을 완화하거나 제거하는 메커니즘을 말한다. 이는 네트워크의 성능과 안정성을 유지하는 데 핵심적인 역할을 한다. 특히 TCP 프로토콜은 신뢰성 있는 연결 지향 통신을 제공하면서, 혼잡 제어를 핵심 기능으로 통합하여 인터넷의 확장성과 견고함을 가능하게 했다.
혼잡은 네트워크 경로 상의 하나 이상의 라우터나 링크에 트래픽 부하가 과도하게 걸려 패킷 손실이나 긴 지연 시간이 발생하는 상태를 의미한다. 혼잡 제어는 송신자가 네트워크 상태를 간접적으로 파악하여 전송 속도를 동적으로 조정한다. 주요 목표는 네트워크 자원을 효율적으로 활용하면서도 여러 연결 간에 공정하게 대역폭을 분배하고, 패킷 손실과 큐잉 지연을 최소화하는 것이다.
초기 TCP는 혼잡 제어 메커니즘 없이 흐름 제어만으로 동작했으나, 1980년대 중반 발생한 '혼잡 붕괴' 사태 이후 혼잡 제어의 필요성이 절실해졌다. 이에 따라 TCP Tahoe, TCP Reno와 같은 기본 알고리즘이 개발되었고, 이후 네트워크 환경의 변화에 따라 TCP NewReno, TCP CUBIC, BBR 등 다양한 고급 알고리즘들이 진화해왔다. 이러한 알고리즘들은 혼잡 윈도우 크기를 조절하는 방식을 통해 혼잡을 관리한다.
혼잡 제어는 전송 계층의 핵심 기능으로, 인터넷의 핵심 인프라가 원활하게 작동하는 데 기여한다. 이는 단순한 프로토콜 기능을 넘어 네트워크 전체의 효율성과 공정성을 결정하는 중요한 요소로 자리 잡았다.
2. 혼잡 제어의 필요성과 목표
2. 혼잡 제어의 필요성과 목표
혼잡 제어는 네트워크의 혼잡 상태를 감지하고, 데이터 전송 속도를 조절하여 네트워크 성능을 최적화하는 메커니즘이다. 이는 패킷 교환 네트워크에서 필수적인 기능으로, 네트워크 자원이 수요를 초과할 때 발생하는 문제를 해결하기 위해 설계되었다. 혼잡 제어가 없다면, 네트워크는 패킷 손실과 과도한 지연으로 인해 전체 처리량이 급격히 저하될 수 있다.
혼잡의 주요 원인은 네트워크 경로 상의 라우터나 스위치와 같은 장치들의 버퍼 오버플로우이다. 여러 송신자가 한정된 대역폭을 공유할 때, 각자가 가능한 최대 속도로 데이터를 전송하면 공유된 링크나 라우터의 큐에 패킷이 빠르게 쌓인다. 큐가 가득 차면 이후 도착하는 패킷은 버려지게 되며, 이는 패킷 손실로 이어진다. 손실된 패킷은 재전송을 유발하여 네트워크 부하를 더욱 가중시키고, 결과적으로 처리량 감소와 지연 시간 증가라는 악순환을 초래한다[1].
따라서 혼잡 제어의 핵심 목표는 다음과 같다.
1. 네트워크 효율성 유지: 가능한 높은 총 처리량을 달성하면서 네트워크가 포화 상태에 이르지 않도록 방지한다.
2. 공정성 확보: 네트워크를 공유하는 여러 흐름(flow) 간에 대역폭을 공정하게 분배한다.
3. 패킷 손실 최소화: 라우터 버퍼 오버플로우를 줄여 불필요한 재전송을 방지한다.
4. 지연 시간 관리: 큐에 과도하게 쌓인 패킷으로 인한 대기 지연을 완화한다.
이 목표들은 상호 간에 트레이드오프 관계에 있을 수 있다. 예를 들어, 지나치게 공격적인 혼잡 제어는 높은 처리량을 얻을 수 있지만 공정성을 해치고, 지나치게 보수적인 제어는 공정성과 낮은 지연을 보장하지만 대역폭을 충분히 활용하지 못할 수 있다. 효과적인 혼잡 제어 알고리즘은 이러한 균형을 유지하면서 동적으로 변화하는 네트워크 상태에 적응한다.
2.1. 혼잡의 원인과 영향
2.1. 혼잡의 원인과 영향
혼잡은 네트워크 경로 상의 하나 이상의 라우터나 링크에서 수신되는 트래픽 양이 처리 용량을 초과할 때 발생한다. 이는 주로 여러 TCP 연결이 동일한 병목 구간을 공유하면서 데이터를 과도하게 전송할 때 일어난다. 혼잡의 직접적인 원인은 일반적으로 송신자가 네트워크의 사용 가능한 대역폭을 정확히 알지 못하고, 수신자의 처리 능력만을 고려한 흐름 제어만으로는 네트워크 내부 상태를 제어할 수 없기 때문이다.
혼잡이 발생하면 여러 부정적인 영향이 나타난다. 첫째, 라우터의 버퍼가 포화 상태가 되어 패킷 손실이 발생한다. 이 손실은 재전송을 유발하며, 이로 인해 실제 유효한 처리량이 감소하고 네트워크 자원이 낭비된다. 둘째, 패킷이 버퍼에서 대기하는 큐잉 지연이 증가하여 전체 종단 간 지연이 늘어난다. 지연의 증가는 실시간 애플리케이션의 성능을 크게 저하시킨다. 셋째, 심각한 혼잡은 혼잡 붕괴를 초래할 수 있다. 이는 네트워크가 유용한 작업을 거의 수행하지 못하는 상태로, 손실된 패킷의 재전송 트래픽이 네트워크 용량의 대부분을 차지하게 되는 악순환이 지속되는 현상이다[2].
혼잡의 원인 | 주요 영향 |
|---|---|
네트워크 병목 구간에서의 트래픽 과부하 | 패킷 손실 및 재전송 증가 |
송신자의 과도한 데이터 전송 속도 | 큐잉 지연 및 종단 간 지연 증가 |
여러 연결 간의 대역폭 경쟁 | 네트워크 처리량 감소 및 공정성 문제 |
제어 메커니즘의 부재 또는 실패 | 혼잡 붕괴 가능성 |
따라서, 혼잡 제어는 이러한 문제를 완화하고 네트워크를 안정된 상태로 유지하는 것을 목표로 한다. 효과적인 혼잡 제어는 패킷 손실을 최소화하면서도 가능한 높은 처리량을 달성하고, 여러 연결이 공정하게 대역폭을 공유하도록 하며, 예측 가능한 지연을 제공해야 한다.
2.2. 혼잡 제어의 주요 목표
2.2. 혼잡 제어의 주요 목표
혼잡 제어의 주요 목적은 네트워크의 혼잡 붕괴를 방지하고, 네트워크 자원을 효율적이고 공정하게 분배하며, 사용자에게 만족스러운 서비스 품질을 제공하는 데 있다. 구체적인 목표는 다음과 같이 나눌 수 있다.
첫 번째 핵심 목표는 네트워크의 안정성을 유지하는 것이다. 이는 송신자가 네트워크의 처리 능력을 초과하는 데이터를 무분별하게 전송하지 않도록 제어하여, 패킷 손실이 과도하게 발생하고 전송 지연이 급증하는 혼잡 붕괴 상태에 이르는 것을 방지하는 것을 의미한다. 혼잡 제어 알고리즘은 네트워크가 수용할 수 있는 한계, 즉 대역폭 지연 곱 내에서 데이터 흐름을 조절함으로써 네트워크를 안정된 운영 상태로 유지하려고 한다.
두 번째 목표는 효율성과 공정성의 균형을 달성하는 것이다. 효율성은 사용 가능한 네트워크 대역폭을 최대한 활용하여 높은 총 처리량을 얻는 것을 말한다. 공정성은 네트워크를 공유하는 여러 연결(예: 여러 TCP 흐름)이 자원을 공정하게 나누어 사용하도록 보장하는 것이다. 이상적인 혼잡 제어는 모든 흐름이 동등한 대역폭을 얻도록 하거나, 필요에 따라 가중치를 둔 공정성을 제공한다. 예를 들어, AIMD 방식은 공정성 수렴 특성이 우수한 것으로 알려져 있다.
마지막으로, 사용자 경험과 관련된 품질 목표를 충족시키는 것이다. 이에는 지터와 왕복 지연 시간을 낮게 유지하여 대화형 응용 프로그램의 반응성을 보장하고, 처리량을 일정 수준 이상으로 유지하여 파일 전송 등의 효율을 높이는 것이 포함된다. 다양한 네트워크 환경(유선, 무선, 고속 장거리)과 응용 프로그램의 요구사항에 맞춰 이러한 목표들 사이의 최적의 균형점을 찾는 것이 혼잡 제어 알고리즘 설계의 핵심 과제이다.
3. TCP 혼잡 제어의 기본 원리
3. TCP 혼잡 제어의 기본 원리
혼잡 제어의 핵심은 송신자가 네트워크의 상태를 추정하여 적절한 데이터 전송 속도를 결정하는 것이다. TCP는 ACK 기반의 신뢰성 있는 전송을 제공하면서도, 네트워크에 과부하를 주지 않도록 설계된 혼잡 제어 메커니즘을 포함한다. 이 메커니즘의 기본은 혼잡 윈도우와 AIMD 알고리즘이다.
혼잡 윈도우는 송신자가 ACK를 기다리지 않고 한 번에 전송할 수 있는 데이터의 최대 양을 결정하는 변수이다. 이는 수신자의 처리 능력을 반영하는 수신 윈도우와는 별개로, 네트워크의 혼잡 상태를 반영한다. 실제 전송 윈도우 크기는 수신 윈도우와 혼잡 윈도우 중 더 작은 값으로 결정된다. 송신자는 패킷 손실(타임아웃 또는 중복 ACK)을 혼잡 발생의 주요 신호로 간주하고, 이에 따라 혼잡 윈도우 크기를 동적으로 조절한다.
혼잡 윈도우를 조절하는 대표적인 원칙이 AIMD이다. 이는 혼잡이 감지되지 않을 때는 윈도우 크기를 선형적으로 증가시키고(Additive Increase), 혼잡이 감지되면 윈도우 크기를 급격히 줄이는(Multiplicative Decrease) 방식이다. 구체적인 동작은 다음과 같다.
단계 | 동작 | 혼잡 윈도우(cwnd) 변화 |
|---|---|---|
증가 단계 | 모든 ACK를 정상 수신 | cwnd = cwnd + 1/cwnd (매 RTT당 약 1 MSS 증가) |
감소 단계 | 패킷 손실(혼잡) 감지 | cwnd = cwnd / 2 (보통 반으로 감소) |
이 방식은 여러 TCP 연결이 네트워크를 공유할 때 공정한 대역폭 분배를 유도한다. 각 연결이 혼잡 시 윈도우를 반으로 줄이면, 남은 대역폭을 다른 연결이 서서히 점유하게 되어 결국 모든 연결이 비슷한 크기의 윈도우를 유지하는 상태로 수렴한다. AIMD는 단순하면서도 강건한 특성으로 TCP 혼잡 제어의 근간을 이루었다.
3.1. 혼잡 윈도우(Congestion Window)
3.1. 혼잡 윈도우(Congestion Window)
혼잡 윈도우(Congestion Window, cwnd)는 송신자가 ACK를 기다리지 않고 한 번에 전송할 수 있는 데이터의 최대 양을 결정하는 TCP 상태 변수이다. 이는 수신자의 버퍼 용량을 반영하는 수신 윈도우(rwnd)와 함께, 실제 전송 가능한 데이터 양을 제한하는 데 사용된다. 송신자는 min(cwnd, rwnd) 만큼의 데이터를 네트워크로 보낼 수 있다. 혼잡 윈도우의 핵심 목적은 송신자가 네트워크의 혼잡 상태를 스스로 추정하고, 그에 따라 전송 속도를 조절하여 네트워크 혼잡을 방지하는 것이다.
혼잡 윈도우의 크기는 패킷 손실이나 지연 증가와 같은 혼잡 신호를 감지하면 감소하고, 정상적인 전송이 이루어지면 점진적으로 증가한다. 초기 연결 시 혼잡 윈도우는 일반적으로 1, 2 또는 10개의 MSS(Maximum Segment Size) 값으로 낮게 시작한다. 이후 ACK가 성공적으로 수신되면, 혼잡 제어 알고리즘에 따라 윈도우 크기가 증가한다. 이 증가 방식은 느린 시작(Slow Start)과 혼잡 회피(Congestion Avoidance)와 같은 단계에 따라 달라진다.
혼잡 윈도우의 동작은 AIMD(Additive Increase Multiplicative Decrease) 원칙을 따르는 경우가 많다. 즉, 혼잡이 없을 때는 윈도우를 선형적으로(가법적으로) 증가시키고, 혼잡이 감지되면 윈도우를 급격히(승법적으로) 감소시킨다. 예를 들어, TCP Reno에서는 패킷 손실을 혼잡 신호로 간주하여 혼잡 윈도우를 절반으로 줄인다. 이는 네트워크에 쌓인 큐잉 지연을 빠르게 해소하고, 다수의 연결이 공평하게 대역폭을 공유할 수 있도록 한다.
혼잡 윈도우의 크기는 네트워크의 대역폭 지연 곱(Bandwidth-Delay Product, BDP)과 밀접한 관련이 있다. 이상적인 혼잡 윈도우 크기는 네트워크 경로의 병목 링크의 대역폭과 왕복 지연 시간을 곱한 값에 가까워야 최대 처리량을 달성할 수 있다. 현대의 고성능 혼잡 제어 알고리즘인 TCP CUBIC이나 BBR은 이 혼잡 윈도우를 조절하는 방식을 더욱 정교하게 발전시켜, 다양한 네트워크 조건에서 높은 효율성을 추구한다.
3.2. AIMD (Additive Increase Multiplicative Decrease)
3.2. AIMD (Additive Increase Multiplicative Decrease)
AIMD는 혼잡 윈도우 크기를 조절하는 핵심적인 피드백 제어 알고리즘이다. 이 방식은 네트워크에 혼잡이 감지되지 않을 때는 윈도우 크기를 선형적으로 증가시키고, 혼잡이 발생하면 윈도우 크기를 지수적으로 감소시킨다. 구체적으로, 모든 RTT마다 ACK를 성공적으로 수신하면 혼잡 윈도우를 1 MSS(Maximum Segment Size)만큼 증가시키는 것이 '가산 증가(Additive Increase)'에 해당한다. 반면, 패킷 손실(타임아웃 또는 중복 ACK 수신)을 혼잡의 신호로 간주하여 혼잡 윈도우 크기를 반으로 줄이는 것이 '곱셈 감소(Multiplicative Decrease)'이다.
이 알고리즘의 주요 목표는 여러 TCP 연결이 네트워크 자원을 공정하게 나누어 사용하도록 하는 것이다. 각 연결이 혼잡 시 윈도우를 급격히 줄임으로써 네트워크의 혼잡을 빠르게 해소하고, 이후 서로 비슷한 속도로 윈도우를 키워나가게 된다. 결과적으로, 여러 흐름이 장기적으로는 대역폭을 균등하게 공유하는 경향을 보인다.
AIMD의 동작은 다음과 같은 특성을 가진다.
단계 | 조건 | 혼잡 윈도우 조정 | 목적 |
|---|---|---|---|
가산 증가(AI) | 정상적인 ACK 수신 |
| 사용 가능한 대역폭을 서서히 탐색 |
곱셈 감소(MD) | 패킷 손실 감지 |
| 혼잡을 신속히 완화하고 네트워크에 부하 감소 신호 전달 |
그러나 AIMD는 본질적으로 보수적인 알고리즘이다. 대역폭을 천천히 탐색하기 때문에 고속 네트워크에서 전체 대역폭을 빠르게 활용하지 못할 수 있다. 또한, 혼잡이 발생하면 윈도우 크기가 급격히 줄어들어 처리량이 갑자기 떨어지는 '톱니파(sawtooth)' 형태의 성능 곡선을 보이는 특징이 있다. 이러한 기본적인 AIMD 메커니즘은 이후 TCP Tahoe, Reno를 비롯한 대부분의 TCP 혼잡 제어 알고리즘의 근간이 되었다.
4. TCP Tahoe와 Reno
4. TCP Tahoe와 Reno
TCP Tahoe는 TCP 혼잡 제어의 초기 대표적인 알고리즘이다. 이 알고리즘은 느린 시작과 혼잡 회피라는 두 가지 주요 단계를 도입했다. 연결 초기에는 혼잡 윈도우 크기를 1부터 시작하여 매 RTT마다 지수적으로 증가시킨다. 이는 네트워크 용량을 빠르게 탐색하는 단계이다. 혼잡 윈도우가 느린 시작 임계값에 도달하거나 패킷 손실이 감지되면, 혼잡 회피 단계로 전환된다. 혼잡 회피 단계에서는 윈도우 크기를 선형적으로 증가시킨다. Tahoe는 타임아웃 또는 세 개의 중복 ACK를 패킷 손실의 징후로 판단하고, 이때 혼잡 윈도우 크기를 1로 줄이고 느린 시작 단계를 다시 시작한다.
TCP Reno는 Tahoe의 개선판으로, 빠른 재전송과 빠른 회복 메커니즘을 추가했다. 세 개의 중복 ACK를 받으면, Reno는 타임아웃을 기다리지 않고 즉시 손실된 세그먼트를 재전송한다. 이후 Tahoe와 달리 윈도우 크기를 1로 줄이지 않고, 반으로 줄이고 혼잡 회피 단계로 진입한다. 이는 단일 패킷 손실에 대한 복구 시간을 크게 단축시킨다. 그러나 Reno는 한 RTT 내에 여러 패킷이 손실되는 경우에 비효율적이다. 첫 번째 손실에 대한 빠른 재전송 후, 나머지 손실 패킷들은 타임아웃이 발생할 때까지 기다려야 하기 때문이다.
두 알고리즘의 핵심 동작을 비교하면 다음과 같다.
특징 | TCP Tahoe | TCP Reno |
|---|---|---|
손실 감지 | 타임아웃 또는 3 중복 ACK | 타임아웃 또는 3 중복 ACK |
손실 후 동작 | 윈도우 크기 = 1, 느린 시작 재개 | 윈도우 크기 = 절반, 혼잡 회피 단계로 |
주요 메커니즘 | 느린 시작, 혼잡 회피 | 느린 시작, 혼잡 회피, 빠른 재전송, 빠른 회복 |
다중 패킷 손실 | 비효율적 | 부분적 개선,但仍存有局限性[3] |
Tahoe와 Reno는 AIMD 원칙을 구현한 기초적인 알고리즘으로, 이후 등장하는 TCP NewReno, TCP SACK, TCP CUBIC 등 더 발전된 알고리즘들의 토대를 마련했다.
4.1. Tahoe: 느린 시작과 혼잡 회피
4.1. Tahoe: 느린 시작과 혼잡 회피
TCP Tahoe는 TCP 혼잡 제어의 초기이자 기본적인 알고리즘으로, 느린 시작(Slow Start)과 혼잡 회피(Congestion Avoidance)라는 두 가지 핵심 메커니즘을 도입했다. 이 알고리즘은 혼잡 윈도우(cwnd)의 크기를 동적으로 조절하여 네트워크의 혼잡을 감지하고 대응한다. TCP Tahoe의 이름은 4.3BSD Tahoe 릴리스에 처음 구현된 데서 유래했다.
느린 시작 단계에서는 연결 초기에 혼잡 윈도우를 1 또는 2개의 세그먼트 크기로 낮게 시작한다. 이후 매 ACK 수신마다 윈도우 크기를 1씩 증가시키는데, 이는 실제로 ACK 하나당 2개의 새로운 패킷을 전송할 수 있게 되어 지수 함수적으로 윈도우가 증가하는 효과를 낳는다[4]. 이는 초기 전송 속도를 빠르게 높이면서도 네트워크에 갑작스러운 부하를 주지 않기 위한 설계다. 느린 시작은 혼잡 윈도우가 사전에 설정된 임계값(ssthresh)에 도달할 때까지 계속된다.
혼잡 회피 단계는 혼잡 윈도우가 임계값에 도달한 후 시작된다. 이 단계에서는 더 이상 지수적 증가를 하지 않고, 선형적인 증가를 통해 보다 신중하게 대역폭을 탐색한다. 구체적으로, 매 RTT(왕복 시간)마다 혼잡 윈도우를 1개 세그먼트 크기만큼 증가시킨다[5]. 이는 네트워크가 포화 상태에 가까워졌을 가능성을 고려한 조치다. 만약 패킷 손실이 발생하면(주로 타임아웃으로 감지), Tahoe는 심각한 혼잡으로 간주하고 임계값을 현재 혼잡 윈도우의 절반으로 낮추고, 혼잡 윈도우를 다시 1로 초기화하여 느린 시작 단계부터 재개한다.
단계 | 조건 | 혼잡 윈도우(cwnd) 변화 | 임계값(ssthresh) 변화 |
|---|---|---|---|
느린 시작 | cwnd < ssthresh | 매 RTT마다 지수적 증가(매 ACK당 +1) | 변동 없음 |
혼잡 회피 | cwnd >= ssthresh | 매 RTT마다 선형 증가(매 ACK당 +1/cwnd) | 변동 없음 |
혼잡 발생 시 | 타임아웃 감지 | cwnd = 1 (초기화) | ssthresh = 현재 cwnd / 2 |
Tahoe의 주요 한계는 단일 패킷 손실이 발생하더라도 항상 타임아웃을 기다려야 하며, 혼잡 윈도우를 1로 크게 줄이기 때문에 전송 속도가 급격히 떨어진다는 점이다. 이로 인해 처리량이 낮아지는 문제가 발생했고, 이는 후속 알고리즘인 TCP Reno에서 빠른 재전송 메커니즘을 도입하는 계기가 되었다.
4.2. Reno: 빠른 재전송과 빠른 회복
4.2. Reno: 빠른 재전송과 빠른 회복
TCP Reno는 TCP Tahoe의 단점을 보완하기 위해 도입된 혼잡 제어 알고리즘이다. Tahoe는 패킷 손실을 감지하면 혼잡 윈도우 크기를 1로 줄이고 느린 시작 단계부터 다시 시작한다. 이로 인해 단일 패킷 손실에도 처리량이 급격히 감소하는 문제가 있었다. Reno는 이러한 비효율성을 해결하기 위해 빠른 재전송과 빠른 회복이라는 두 가지 핵심 메커니즘을 추가했다.
빠른 재전송은 중복 ACK를 이용해 타임아웃을 기다리지 않고 손실을 조기에 감지한다. 송신자는 동일한 시퀀스 번호에 대한 중복 ACK를 3개 연속으로 받으면, 해당 패킷이 손실되었다고 판단하고 즉시 재전송한다. 빠른 회복은 손실 후의 혼잡 윈도우 조정 방식을 개선한다. 패킷 손실이 발생하면, 혼잡 윈도우 크기를 반으로 줄이는 것은 Tahoe와 같지만, 1로 설정하지 않고 새로운 값으로 바로 혼잡 회피 단계로 진입한다. 이때, 빠른 회복 상태에서는 중복 ACK가 도착할 때마다 혼잡 윈도우를 약간 증가시켜, 손실된 패킷의 빈자리를 채울 새로운 패킷을 전송할 수 있도록 한다.
Reno의 동작은 다음과 같은 단계로 요약할 수 있다.
1. 정상 전송: 느린 시작과 혼잡 회피를 통해 AIMD 방식으로 윈도우를 증가시킨다.
2. 손실 감지: 3개의 중복 ACK를 수신하면 빠른 재전송을 수행한다.
3. 빠른 회복:
* 혼잡 윈도우 크기를 반으로 줄이고, 그 값을 임계값으로 설정한다.
* 손실된 패킷을 재전송하고, 빠른 회복 상태로 진입한다.
* 빠른 회복 상태에서는 중복 ACK마다 혼잡 윈도우를 1 MSS씩 증가시킨다.
4. 회복 완료: 손실된 시퀀스 번호에 대한 새로운 ACK를 받으면, 혼잡 윈도우를 임계값으로 설정하고 혼잡 회피 단계로 돌아간다.
Reno는 단일 패킷 손실에 대한 복구 성능을 크게 향상시켰다. 그러나 여러 패킷이 한 왕복 지연 시간 내에 손실되는 경우, 빠른 회복이 한 번만 발생하여 나머지 손실 패킷에 대한 복구가 지연될 수 있다는 한계가 있다. 이는 이후 TCP NewReno와 SACK 옵션을 통해 개선되었다.
5. TCP NewReno와 SACK
5. TCP NewReno와 SACK
TCP Reno는 단일 패킷 손실에 대한 복구 성능을 향상시켰지만, 한 윈도우 내에서 여러 패킷이 손실되는 경우 성능 저하가 여전히 발생했다. 이러한 한계를 극복하기 위해 등장한 것이 TCP NewReno와 SACK 옵션이다.
TCP NewReno는 Reno의 빠른 회복 단계를 개선한 알고리즘이다. Reno는 빠른 회복 중에 새로운 ACK를 받으면 즉시 혼잡 회피 상태로 빠져나왔는데, 이는 여러 패킷이 손실되었을 때 문제가 된다. NewReno는 '부분적 ACK' 개념을 도입하여, 손실된 시퀀스 번호 이후이지만 아직 모든 손실이 복구되지 않은 중간 ACK를 받더라도 빠른 회복 상태를 유지한다. 이를 통해 한 왕복 시간 내에 여러 손실된 패킷을 모두 재전송하고 복구할 수 있어 처리량을 높인다. 그러나 NewReno 역시 수신자가 정확히 어떤 세그먼트를 받았는지 알지 못하기 때문에, 불필요한 재전송이 발생할 가능성이 남아 있다.
SACK(Selective Acknowledgment) 옵션은 이러한 문제를 근본적으로 해결하기 위한 TCP 옵션이다. 기존의 누적 확인 응답 방식은 연속된 데이터의 수신만을 알릴 수 있었다. 반면 SACK 옵션이 협상되면, 수신자는 비연속적으로 수신한 데이터 블록의 시퀀스 번호 범위를 송신자에게 알려줄 수 있다. 송신자는 이 정보를 바탕으로 정확히 어떤 패킷이 손실되었는지 파악하고, 그 부분만 선택적으로 재전송할 수 있다. 이는 특히 한 윈도우 내에 여러 개의 손실이 산발적으로 발생하는 환경에서 재전송 효율을 극대화한다.
알고리즘/옵션 | 핵심 메커니즘 | 주요 장점 | 한계 |
|---|---|---|---|
TCP NewReno | 부분적 ACK 처리 개선. 빠른 회복 상태를 유지하며 여러 패킷 복구. | Reno 대비 다중 패킷 손실 시 처리량 향상. SACK 미지원 환경에서 유용. | 정확한 손실 위치 파악 불가로 인한 불필요한 재전송 가능성 잔존. |
SACK 옵션 | 수신된 비연속 데이터 블록 정보를 송신자에 전달. | 정확한 선택적 재전송 가능. 다중 패킷 손실 시 재전송 효율 극대화. | TCP 옵션 협상 필요. 패킷 헤더 오버헤드 약간 증가. |
현대 대부분의 운영체제는 TCP NewReno 알고리즘을 기본 혼잡 제어 로직으로 사용하며, SACK 옵션은 광범위하게 활성화되어 있다. 두 기술은 상호 보완적으로 작동하여, 고속 네트워크와 무선 네트워크 같이 패킷 손실이 빈번한 환경에서도 TCP의 안정적인 데이터 전송을 지원한다.
5.1. NewReno의 개선점
5.1. NewReno의 개선점
TCP Reno는 빠른 재전송과 빠른 회복 메커니즘을 도입하여 단일 패킷 손실에 대한 복구 성능을 크게 향상시켰다. 그러나 여러 개의 패킷이 한 왕복 시간(RTT) 내에서 손실되는 경우, Reno는 모든 손실된 패킷이 재전송될 때까지 혼잡 윈도우를 지속적으로 감소시켜 처리량이 급격히 떨어지는 문제가 있었다. TCP NewReno는 이러한 부분적 ACK(Partial ACK) 상황에서의 성능 저하를 해결하기 위해 설계되었다.
NewReno의 핵심 개선점은 '부분적 ACK'에 대한 처리를 개선한 것이다. Reno에서는 빠른 회복 상태에서 새로운 ACK(즉, 손실된 시퀀스 이후의 데이터에 대한 누적 ACK)를 수신하면 바로 빠른 회복 단계를 종료하고 혼잡 회피 단계로 진입했다. 만약 이 새로운 ACK가 모든 손실된 데이터를 커버하지 않는 '부분적 ACK'라면, 아직 확인되지 않은 손실이 남아있음에도 불구하고 윈도우 크기가 잘못 조정될 수 있었다. NewReno는 빠른 회복 상태에서 부분적 ACK를 수신하더라도 해당 상태를 유지한다. 부분적 ACK는 가장 최근에 재전송한 세그먼트까지만 정상 수신되었음을 의미하므로, NewReno는 다음으로 예상되는 손실 세그먼트를 즉시 재전송한다. 이 과정은 손실된 모든 데이터에 대한 완전한 누적 ACK가 도착할 때까지 반복되며, 이를 통해 한 번의 RTT 내에서 발생한 여러 패킷 손실을 더 효율적으로 복구할 수 있다.
다음 표는 Reno와 NewReno의 빠른 회복 동작을 비교한 것이다.
특성 | TCP Reno | TCP NewReno |
|---|---|---|
부분적 ACK 처리 | 부분적 ACK 수신 시 빠른 회복 종료 및 혼잡 회피 시작 | 부분적 ACK 수신 시, 다음 예상 손실 패킷을 재전송하며 빠른 회복 상태 유지 |
다중 패킷 손실 복구 | 비효율적. 각 손실마다 별도의 타임아웃 발생 가능성 높음 | 효율적. 한 번의 빠른 재전송/회복 사이클로 여러 패킷 손실 복구 가능 |
처리량 영향 | 다중 손실 시 처리량 급감 | 다중 손실 시에도 상대적으로 높은 처리량 유지 |
이러한 개선으로 인해 NewReno는 Reno에 비해 네트워크 혼잡이 심한 환경, 즉 패킷 손실 버스트가 빈번하게 발생하는 환경에서 더욱 견고한 성능을 보인다. NewReno는 표준 TCP의 핵심 혼잡 제어 알고리즘으로 광범위하게 채택되었으며, 이후 등장하는 SACK(선택적 확인응답) 옵션과 결합되어 더욱 향상된 성능을 제공하는 기반이 되었다.
5.2. SACK (Selective Acknowledgment) 옵션
5.2. SACK (Selective Acknowledgment) 옵션
SACK (Selective Acknowledgment) 옵션은 TCP의 표준 재전송 메커니즘을 보완하기 위해 도입된 기능이다. 기존 TCP의 누적 확인응답 방식은 연속된 데이터 스트림 중 일부 세그먼트만 손실되더라도 수신자는 마지막으로 올바르게 수신된 순차적 데이터의 다음 번호만을 ACK로 보낸다. 이로 인해 송신자는 단일 세그먼트 손실이 발생해도 타임아웃이 발생하거나 중복 ACK가 3번 수신될 때까지 손실 범위를 정확히 알지 못하고, 불필요한 재전송을 하거나 파이프라인이 비효율적으로 유지될 수 있다.
SACK 옵션은 이러한 문제를 해결하기 위해, 수신자가 비연속적으로 수신한 데이터 블록의 범위를 송신자에게 추가적으로 알려주는 방식을 사용한다. TCP 헤더의 옵션 필드를 활용하며, 핸드셰이크 과정에서 양측이 SACK-Permitted 옵션을 협상하여 사용 가능 여부를 결정한다. 수신자는 ACK 번호로는 알려줄 수 없는, 순서에 맞지 않게 도착한 데이터의 시작과 끝 시퀀스 번호 쌍을 SACK 블록으로 포함시켜 응답한다. 이를 통해 송신자는 네트워크에서 정상적으로 전달된 데이터를 정확히 파악하고, 손실된 세그먼트만을 선택적으로 재전송할 수 있다.
SACK의 동작은 다음 예시로 설명할 수 있다. 송신자가 시퀀스 번호 1-1000, 1001-2000, 2001-3000, 3001-4000의 네 개 세그먼트를 전송했을 때, 두 번째 세그먼트(1001-2000)가 손실되고 나머지는 정상 도착했다고 가정한다. 수신자는 첫 번째 세그먼트에 대한 ACK 1001을 보낸 후, 세 번째와 네 번째 세그먼트가 도착하면 ACK 번호는 여전히 1001이지만, SACK 옵션 필드에 SACK 2001-4000과 같은 블록 정보를 담아 보낸다. 송신자는 이를 통해 2001 이후의 데이터는 수신되었음을 알고, 손실된 1001-2000 범위의 데이터만 빠르게 재전송한다.
이 옵션은 특히 여러 세그먼트가 연속으로 손실된 환경에서 TCP Reno나 NewReno의 성능을 크게 향상시킨다. 표준 빠른 재전송 모드는 한 번의 윈도우 내에서 하나의 손실만 효율적으로 복구할 수 있지만, SACK을 사용하면 여러 손실 구간을 동시에 인지하고 복구할 수 있어 처리량 저하를 최소화한다. 대부분의 현대 운영체제는 기본적으로 SACK 옵션을 지원하며, 고속 네트워크나 무선 네트워크 같이 손실 가능성이 높은 환경에서 필수적인 기능으로 자리 잡았다.
6. TCP CUBIC
6. TCP CUBIC
TCP CUBIC은 TCP의 혼잡 제어 알고리즘 중 하나로, 리눅스 커널의 기본 알고리즘으로 널리 사용된다. 이 알고리즘은 고속 장거리 네트워크 환경에서 TCP Reno나 NewReno가 가진 성능 한계를 극복하기 위해 개발되었다. CUBIC은 혼잡 윈도우의 증가를 시간의 함수, 특히 3차 함수(큐빅 함수)에 기반하여 결정한다는 점에서 기존의 AIMD 방식과 근본적으로 다르다.
CUBIC의 핵심은 혼잡 윈도우 크기를 시간의 함수로 표현하는 큐빅 함수를 사용하는 데 있다. 알고리즘은 마지막으로 혼잡이 발생한 시점을 기준으로 시간을 측정한다. 혼잡 윈도우는 이 시간 변수의 3차 함수에 따라 증가하며, 함수의 그래프는 마지막 혼잡 발생 시점의 윈도우 크기 근처에서 완만하게 증가하다가 점점 가파르게 상승하는 형태를 보인다. 이 방식은 네트워크가 혼잡 상태에서 회복된 직후에는 윈도우를 천천히 늘려 재차 혼잡을 유발하지 않도록 하다가, 시간이 지나면 더 공격적으로 대역폭을 활용할 수 있게 설계되었다. 또한, 함수는 대칭 형태를 가지도록 설계되어 목표 윈도우 크기에 도달한 후에는 증가 속도를 줄여 과도한 큐잉 지연을 방지한다.
CUBIC은 고대역폭-지연 곱 네트워크에서 특히 우수한 성능을 보인다. 기존 TCP Reno는 RTT에 민감하여 RTT가 짧은 흐름이 더 많은 대역폭을 차지하는 공정성 문제가 있었지만, CUBIC은 시간 기반의 증가 방식을 채택함으로써 RTT에 덜 민감해졌다. 이로 인해 다양한 RTT를 가진 흐름들 사이의 대역폭 경쟁이 보다 공정하게 이루어진다. 또한, 대역폭이 매우 큰 네트워크에서도 혼잡 윈도우를 빠르고 안정적으로 확장하여 사용 가능한 대역폭을 효율적으로 포화시킬 수 있다.
CUBIC의 주요 매커니즘은 다음과 같이 요약할 수 있다.
단계 | 동작 | 설명 |
|---|---|---|
느린 시작 | 지수적 증가 | 초기에는 전통적인 느린 시작을 사용하여 빠르게 대역폭을 탐색한다. |
혼잡 회피 | 큐빅 함수에 따른 증가 | 패킷 손실이 발생하면 혼잡 윈도우를 감소시키고, 이후 증가는 큐빅 함수에 따른다. |
빠른 회복 | SACK 기반 |
이러한 설계로 인해 CUBIC은 현대 인터넷의 핵심 혼잡 제어 알고리즘으로 자리 잡았으며, TCP BBR과 같은 새로운 접근법이 등장한 후에도 여전히 많은 시스템에서 기본값으로 사용되고 있다.
6.1. CUBIC의 큐빅 함수 원리
6.1. CUBIC의 큐빅 함수 원리
TCP CUBIC은 TCP Reno의 AIMD 방식이 고대역폭·고지연 네트워크에서 효율적으로 대역폭을 활용하지 못하는 문제를 해결하기 위해 개발되었다. 핵심 혁신은 혼잡 윈도우 크기를 조절하는 데 AIMD의 선형 증가 방식을 버리고, 3차 함수(큐빅 함수)를 사용하는 것이다. 이 함수는 혼잡 윈도우 크기를 마지막 패킷 손실이 발생한 시점으로부터 경과한 시간의 함수로 정의한다.
큐빅 함수의 기본 형태는 다음과 같다.
W(t) = C*(t-K)³ + W_max
여기서 W(t)는 시간 t에서의 목표 혼잡 윈도우 크기이며, C는 스케일링 팩터이다. W_max는 마지막 혼잡 발생 시점의 혼잡 윈도우 크기 기록값이다. 핵심 변수 K는 함수의 정점(극대점)까지의 시간으로, K = ³√(W_max * β / C)로 계산된다. 여기서 β는 혼잡 회피 시 윈도우 감소 계수이다.
이 함수의 그래프는 시간축을 기준으로 대칭인 S자 형태 곡선을 그린다. 혼잡 발생 후 윈도우 크기가 급격히 감소(W_max * β)하면, 알고리즘은 빠르게 윈도우를 회복 구간까지 증가시킨다. 이후 W_max에 근접할수록 증가 속도가 느려져 공격적으로 대역폭을 점유하지 않고, W_max를 약간 넘어선 후 다시 완만하게 감소하는 형태를 취한다. 이 설계는 네트워크가 혼잡을 겪은 후 오랫동안 안정 상태를 유지했다면, 그 사이 사용 가능한 대역폭이 증가했을 가능성을 고려한다. 시간이 흐를수록 함수의 목표 윈도우 값이 W_max를 넘어 점점 더 커지도록 함으로써, 새로운 대역폭을 탐색(프로빙)하는 메커니즘을 제공한다.
결과적으로, CUBIC은 RTT에 독립적으로 동작하여 긴 지연 시간을 가진 네트워크 연결에서도 공정하게 대역폭을 점유할 수 있다. 또한, AIMD 방식에 비해 대역폭 활용도를 높이면서도, 지나치게 공격적으로 증가하지 않는 안정적인 특성을 보인다.
6.2. 고대역폭 지연 곱 네트워크에서의 성능
6.2. 고대역폭 지연 곱 네트워크에서의 성능
TCP CUBIC은 고대역폭 지연 곱 네트워크 환경에서 기존 AIMD 기반 TCP 알고리즘들이 보이던 성능 한계를 극복하도록 설계되었다. 기존 TCP Reno나 TCP NewReno는 혼잡 윈도우를 선형적으로 증가시키기 때문에, 대역폭이 크고 지연 시간이 긴 링크에서 대역폭을 효율적으로 활용하는 데 시간이 너무 오래 걸리는 문제가 있었다. CUBIC은 혼잡 윈도우의 성장을 시간의 함수, 특히 마지막 혼잡 사건이 발생한 이후 경과한 시간의 큐빅 함수로 결정함으로써 이 문제를 해결한다.
이 방식은 고대역폭 지연 곱 조건에서 몇 가지 뚜렷한 장점을 보인다. 첫째, 혼잡 윈도우가 빠르게 성장하여 사용 가능한 대역폭을 신속하게 포화시킬 수 있다. 둘째, 혼잡이 빈번하게 발생하지 않는 안정적인 상태에서는 혼잡 윈도우가 마지막 혼잡 포인트 근처에서 매우 천천히 증가하여 네트워크 혼잡을 유발하지 않으면서도 대역폭을 꾸준히 탐색한다. 이는 RTT에 덜 민감한 성장 곡선을 만들어, 지연 시간이 다양한 글로벌 네트워크에서도 일관된 성능을 제공하는 데 기여한다.
성능 측면에서 CUBIC은 고대역폭 지연 곱 네트워크에서 기존 TCP 대비 우수한 처리량과 공정성을 동시에 달성한다. 다음 표는 주요 성능 특성을 비교한 것이다.
특성 | 고대역폭 지연 곱 네트워크에서의 성능 |
|---|---|
대역폭 활용도 | 큐빅 함수 기반의 공격적이면서도 안정적인 성장으로 사용 가능한 고대역폭을 신속하게 포화시킨다. |
RTT 공정성 | |
혼잡 후 회복 속도 | |
대규모 패킷 손실 복구 | SACK 옵션과 결합되어 여러 패킷이 한 번에 손실되는 상황에서도 효율적으로 대역폭을 유지한다. |
이러한 특성으로 인해 CUBIC은 장거리 고속 백본 네트워크나 데이터 센터 간 링크와 같은 현대적인 고대역폭 지연 곱 환경에서 사실상의 표준 혼잡 제어 알고리즘으로 자리 잡았다. 리눅스 커널의 기본 TCP 알고리즘으로 채택되면서 광범위하게 배포되어 그 실용성이 입증되었다.
7. BBR (Bottleneck Bandwidth and Round-trip propagation time)
7. BBR (Bottleneck Bandwidth and Round-trip propagation time)
BBR은 구글이 2016년에 발표한 혼잡 제어 알고리즘이다. 기존의 손실 기반 혼잡 제어 방식과 근본적으로 다른 접근법을 채택한다. 패킷 손실을 혼잡의 주요 신호로 간주하는 대신, 실제 네트워크 경로의 두 가지 핵심 물리적 특성인 대역폭과 지연 시간을 직접 측정하여 데이터 전송 속도를 결정한다. 이 알고리즘의 목표는 대역폭-지연 곱을 효율적으로 채우면서도 큐잉 지연을 최소화하여 낮고 안정적인 지연 시간을 유지하는 것이다.
BBR의 동작은 네 가지 단계로 구성된 상태 머신을 통해 이루어진다. 첫 번째 단계는 Startup으로, 느린 시작과 유사하게 전송 속도를 지수적으로 증가시켜 사용 가능한 대역폭을 빠르게 탐색한다. 두 번째 단계는 Drain으로, Startup 단계에서 발생시킨 버퍼블로트를 배수하기 위해 전송 속도를 일시적으로 낮춰 큐를 비운다. 세 번째 단계는 ProbeBW로, 안정적인 운영 상태에서 대역폭 변동을 감지하기 위해 주기적으로 전송 속도를 약간 높였다가 다시 낮추는 탐색을 반복한다. 네 번째 단계는 ProbeRTT로, 주기적으로 전송 속도를 크게 낮추어 최소 왕복 지연 시간을 정확히 측정한다.
BBR은 특히 고속 광대역 네트워크나 장거리 해저 케이블과 같은 고 대역폭-지연 곱 환경에서 기존 TCP CUBIC 대비 우수한 성능을 보인다. 패킷 손실에 덜 민감하여 처리량을 유지하면서도, 큐에 패킷을 과도하게 쌓지 않으므로 지연 시간과 지터를 크게 줄일 수 있다. 그러나 아직 표준화가 완전히 이루어지지 않았으며, 다른 혼잡 제어 알고리즘과의 공정성 문제나 특정 네트워크 토폴로지에서의 비효율성 등 해결해야 할 과제도 남아 있다[6].
7.1. 대역폭과 지연 시간 기반 접근법
7.1. 대역폭과 지연 시간 기반 접근법
BBR은 기존 손실 기반 혼잡 제어 알고리즘과 근본적으로 다른 접근 방식을 채택한다. 기존 방식은 패킷 손실을 네트워크 혼잡의 주요 지표로 간주하고, 손실 발생 시 전송 속도를 급격히 낮추는 반응을 보였다. 그러나 BBR은 패킷 손실 자체보다는 네트워크 경로의 두 가지 근본적인 물리적 특성, 즉 대역폭과 왕복 지연 시간에 주목한다. BBR의 핵심 가정은 네트워크의 최적 운영 지점이 바로 최대 대역폭과 최소 지연 시간이 교차하는 지점이라는 것이다. 이 지점을 정확히 추정하여 그 근처에서 동작함으로써, 큐에 불필요한 패킷을 쌓지 않으면서도 링크를 효율적으로 활용하는 것을 목표로 한다.
BBR은 연결 수립 후 지속적으로 패킷을 전송하며 네트워크 경로의 현재 상태를 탐색한다. 이 과정에서 가장 중요한 두 가지 메트릭을 측정한다. 첫째는 'BtlBw'로 불리는 병목 링크 대역폭이다. 이는 일정 시간 동안 측정된 최대 전달 속도로 추정된다. 둘째는 'RTprop'로 불리는 전파 지연 시간이다. 이는 네트워크가 비어 있을 때(즉, 큐에 대기 중인 패킷이 없을 때) 측정되는 최소 왕복 시간이다. BBR은 이 두 값을 곱한 대역폭-지연 곱을 계산하여, 네트워크 파이프를 가득 채우는 데 필요한 최적의 데이터 양을 결정한다. 알고리즘은 주기적으로 전송 속도를 일시적으로 높여 대역폭의 변화를 탐지하고, 왕복 시간을 모니터링하여 큐가 형성되고 있는지 감시한다.
이 접근법의 주요 장점은 패킷 손실에 덜 민감하게 반응한다는 점이다. 무선 환경에서의 일시적 손실이나 경로 변경으로 인한 손실을 혼잡으로 오인하여 불필요하게 속도를 낮추는 상황을 크게 줄일 수 있다. 또한, 네트워크 큐에 과도한 패킷을 축적시키지 않으므로 버퍼블로트로 인한 긴 지연을 방지하고, 더 안정적인 지연 시간을 제공할 수 있다. 결과적으로 BBR은 특히 고대역폭-지연 곱 네트워크나 변동이 심한 무선 환경에서 높은 처리량과 낮은 지연을 동시에 달성하는 데 유리한 성능을 보인다.
7.2. BBR의 동작 단계
7.2. BBR의 동작 단계
BBR은 혼잡 제어 알고리즘으로, 대역폭과 왕복 지연 시간을 직접 측정하여 혼잡 윈도우 크기를 결정합니다. 그 동작은 크게 네 가지 단계를 순환하며 진행됩니다.
첫 번째 단계는 시작(Startup) 단계입니다. 이 단계는 느린 시작과 유사하게, 전송 속도를 빠르게 증가시켜 사용 가능한 대역폭을 탐색합니다. 전송 속도가 더 이상 증가하지 않을 때, 즉 측정된 대역폭 값이 수렴할 때까지 지수적으로 증가시킵니다. 이후 두 번째 단계인 배수 감소(Drain) 단계로 진입합니다. 배수 감소 단계에서는 네트워크 버퍼에 쌓인 큐를 배수하기 위해 전송 속도를 일시적으로 낮춥니다. 이는 버퍼블로트를 해소하고 실제 전파 지연에 가까운 낮은 대기열 지연 상태를 만들기 위한 목적을 가집니다.
세 번째 단계는 대역폭 탐색(Probe BW) 단계로, BBR의 핵심 주기입니다. 이 단계에서는 안정적으로 측정된 대역폭 값 주변으로 주기적으로 전송 속도를 높였다 낮추는 탐색을 반복합니다. 이를 통해 네트워크의 사용 가능한 대역폭이 변화했는지를 지속적으로 감지합니다. 네 번째 단계는 지연 시간 탐색(Probe RTT) 단계입니다. 주기적으로(일반적으로 10초마다) 전송 속도를 크게 낮추고 왕복 지연 시간을 재측정하여 최소 RTT 값을 갱신합니다. 이는 경로의 지연 시간 특성이 변화했을 경우를 대비하기 위한 단계입니다.
이 네 단계는 네트워크 상태를 지속적으로 모니터링하고 최적의 운영점을 찾기 위해 순환적으로 실행됩니다. BBR은 패킷 손실을 혼잡의 주요 신호로 삼지 않기 때문에, 손실이 발생해도 전송 속도를 급격히 낮추지 않고 측정된 대역폭과 RTT를 기반으로 조정합니다.
8. 혼잡 제어 알고리즘 비교
8. 혼잡 제어 알고리즘 비교
혼잡 제어 알고리즘의 성능은 처리량, 공정성, 지연 시간이라는 세 가지 주요 지표로 평가된다. 처리량은 단위 시간당 성공적으로 전달된 데이터의 양을 의미하며, 혼잡 제어의 핵심 목표는 가능한 높은 처리량을 유지하는 것이다. 공정성은 여러 TCP 연결이 네트워크 자원을 공평하게 공유하는 정도를 나타낸다. 지연 시간은 패킷이 송신자에서 수신자까지 도달하는 데 걸리는 시간으로, 실시간 애플리케이션에 중요한 요소이다. 이러한 지표들은 서로 트레이드오프 관계에 있어, 한 지표를 최적화하면 다른 지표가 저하될 수 있다.
다양한 알고리즘은 네트워크 환경에 따라 상이한 성능을 보인다. 전통적인 AIMD 방식을 사용하는 TCP Reno나 TCP NewReno는 낮은 대역폭과 짧은 지연 시간을 가진 네트워크에서 안정적이고 공정한 성능을 제공한다. 반면, 고대역폭 지연 곱 네트워크에서는 TCP CUBIC이 더 우수한 성능을 발휘한다. CUBIC은 대역폭을 빠르게 탐색하고, 혼잡 윈도우를 큐빅 함수를 통해 부드럽게 증가시켜 높은 처리량을 유지한다. 그러나 공정성 측면에서는 Reno 계열 알고리즘보다 떨어질 수 있다.
알고리즘 | 핵심 메커니즘 | 주요 장점 | 적합한 환경 |
|---|---|---|---|
구현이 간단하고, 공정성이 높음 | 일반적인 지연/대역폭 환경 | ||
큐빅 함수를 이용한 윈도우 증가 | 고대역폭 환경에서 처리량이 높음 | 고대역폭 지연 곱 네트워크 | |
버퍼 블로트를 유발하지 않고 지연이 낮음 | 가변적 대역폭, 높은 버퍼블로트 환경 |
BBR은 패킷 손실을 혼잡의 직접적인 신호로 보지 않고, 대역폭과 지연 시간을 직접 측정하여 혼잡을 제어한다. 이로 인해 버퍼블로트로 인한 과도한 큐잉 지연을 피할 수 있어 지연 시간을 크게 줄일 수 있다. 그러나 BBR은 아직 진화 중인 알고리즘이며, Reno나 CUBIC과의 공정한 자원 공유 문제 등 해결해야 할 과제가 남아 있다. 결론적으로, 단일 최적의 알고리즘은 존재하지 않으며, 네트워크의 특성과 애플리케이션의 요구사항에 따라 적절한 알고리즘을 선택하는 것이 중요하다.
8.1. 성능 지표 (처리량, 공정성, 지연)
8.1. 성능 지표 (처리량, 공정성, 지연)
성능 지표는 혼잡 제어 알고리즘의 효율성과 적합성을 평가하는 핵심 기준이다. 주요 지표로는 처리량, 공정성, 지연이 있으며, 이들은 서로 트레이드오프 관계에 있는 경우가 많다.
처리량은 단위 시간당 성공적으로 전달된 데이터의 양을 의미한다. 이상적인 목표는 네트워크 대역폭을 최대한 활용하면서도 혼잡 붕괴를 유발하지 않는 것이다. 알고리즘은 혼잡 윈도우를 조절하여 병목 현상이 발생하는 링크의 용량에 맞춰 데이터 전송률을 조정한다. 공정성은 여러 TCP 연결이 네트워크 자원을 공평하게 나누어 사용하는 정도를 나타낸다. 예를 들어, AIMD 방식은 근본적으로 공정한 자원 분배를 보장하는 특성을 지닌다. 반면, 일부 고성능 알고리즘은 공정성을 일부 희생하고 단일 연결의 처리량을 극대화할 수 있다.
지연은 패킷이 송신자에서 수신자까지 도달하는 데 걸리는 시간을 말한다. 여기에는 전파 지연과 큐잉 지연이 포함된다. 혼잡 제어 알고리즘은 송신 버퍼나 네트워크 라우터의 큐를 지나치게 채우지 않도록 하여 불필요한 큐잉 지연을 방지해야 한다. 예를 들어, BBR은 대역폭과 지연 시간을 직접 측정하여 큐를 최소화하는 데 초점을 맞춘다. 이러한 지표들은 네트워크 환경에 따라 상대적 중요도가 달라진다.
성능 지표 | 설명 | 측정 목적 | 관련 알고리즘 특성 |
|---|---|---|---|
처리량 | 성공적 전송 데이터율 | 대역폭 활용도 극대화 | 혼잡 윈도우 크기, 회복 속도 |
공정성 | 다수 연결 간 자원 분배 | 연결 간 형평성 보장 | AIMD 기반 감소, 증가 정책 |
지연 | 패킷 전송 소요 시간 | 응답성 및 실시간성 보장 | 큐 관리, 대역폭-지연 곱 추정 |
따라서 알고리즘 선택은 네트워크의 주요 특성(예: 고대역폭·장거리, 무선 환경)과 애플리케이션의 요구사항(예: 대용량 파일 전송, 실시간 스트리밍)에 따라 어떤 지표를 최적화할지 결정하는 과정이다.
8.2. 네트워크 환경별 적합성
8.2. 네트워크 환경별 적합성
네트워크 환경별로 적합한 혼잡 제어 알고리즘은 크게 다릅니다. 각 알고리즘은 특정 네트워크 조건(대역폭, 지연 시간, 패킷 손실 특성)에서 최적의 성능을 내도록 설계되었거나, 특정 조건에서 취약점을 보입니다.
네트워크 환경 | 적합한 알고리즘 | 주요 이유 |
|---|---|---|
저대역폭, 짧은 지연(RTT) 네트워크 | 네트워크 규모가 작아 혼잡을 빠르게 감지하고 대응할 수 있으며, 알고리즘이 단순하여 오버헤드가 적습니다. | |
고대역폭 지연 곱(BDP) 네트워크 | 큰 혼잡 윈도우를 빠르게 채우고 유지할 수 있어 고속 네트워크의 잠재력을 활용합니다. CUBIC은 대역폭을 공격적으로 탐색하고, BBR은 버퍼블로트를 유발하지 않으면서 높은 처리량을 달성합니다. | |
무선 네트워크 (패킷 손실) | SACK을 지원하는 NewReno 또는 CUBIC | 무선 환경의 잡음에 의한 무작위 패킷 손실과 혼잡 손실을 구분하지 못하는 전통적 TCP의 문제를 완화합니다. SACK 옵션을 통해 선택적 재전송이 가능하여 효율성이 높습니다. |
장거리 해저 케이블 (고정된 높은 지연) | BBR, CUBIC | 긴 왕복 지연 시간(RTT)으로 인해 AIMD 기반 알고리즘이 대역폭을 천천히 탐색하는 문제를 해결합니다. BBR은 지연 시간을 명시적으로 측정하여 버퍼를 채우지 않고도 안정적인 처리량을 제공합니다. |
데이터센터 네트워크 (극저지연, 고속) | DCTCP, TIMELY 등 특화 알고리즘 | 짧은 흐름의 완료 시간을 최소화하고, ECN을 적극 활용하여 버퍼 대기 지연을 근본적으로 줄이는 것을 목표로 합니다. |
일반적으로, TCP CUBIC은 다양한 환경에서 강건한 성능을 보여주어 리눅스의 기본 알고리즘으로 널리 채택되었습니다. 반면, BBR은 대역폭과 지연을 직접 측정하는 모델 기반 접근법으로, 버퍼가 큰 네트워크에서 지연을 크게 줄이면서도 높은 처리량을 유지할 수 있습니다. 그러나 BBR은 공정성 측면에서 기존 TCP Reno류의 흐름과 대역폭을 공유할 때 문제를 보일 수 있습니다. 최적의 알고리즘 선택은 네트워크의 지배적인 특성(지연이 주요 문제인지, 손실이 빈번한지, 대역폭이 충분한지 등)과 애플리케이션의 요구사항(처리량 vs. 지연)에 따라 결정됩니다.
9. 실제 구현과 운영
9. 실제 구현과 운영
대부분의 현대 운영체제는 커널 내에 TCP 스택을 구현하여 혼잡 제어 알고리즘을 포함한 TCP 프로토콜을 처리한다. 주요 운영체제는 여러 알고리즘을 지원하며, 기본값이나 사용 가능한 알고리즘 집합이 다르다.
운영체제 | 기본 알고리즘 | 주요 지원 알고리즘 (선택 가능) |
|---|---|---|
리눅스 (최신 커널) | CUBIC, Reno, BBR, DCTCP[7] 등 | |
윈도우 (Windows 10/11) | CUBIC, NewReno, CTCP[8] | |
macOS / iOS | NewReno, BBR (일부 버전) | |
FreeBSD | NewReno, CUBIC, HTCP[9] |
사용자나 관리자는 시스템 튜닝 파라미터를 조정하여 성능을 최적화할 수 있다. 주요 튜닝 항목으로는 초기 혼잡 윈도우(Initial Congestion Window) 크기, 수신 윈도우 크기, 타임아웃 값, 그리고 특정 알고리즘의 세부 파라미터(예: CUBIC의 β 값[10], BBR의 프로빙 간격) 등이 있다. 이러한 설정은 sysctl(리눅스, BSD), 레지스트리(윈도우), 또는 네트워크 드라이버 고급 설정을 통해 변경된다.
운영 환경에서는 네트워크 특성에 맞는 알고리즘 선택이 중요하다. 예를 들어, 장거리 고대역폭 네트워크에는 TCP CUBIC이나 BBR이, 데이터센터 내 저지연 네트워크에는 DCTCP가 더 적합할 수 있다. 또한, ECN(Explicit Congestion Notification) 지원 여부와 같은 네트워크 장비의 기능도 알고리즘의 효과에 영향을 미친다. 불필요한 기본 파라미터 변경은 네트워크 안정성을 해칠 수 있으므로, 변경 시에는 주의 깊은 테스트가 필요하다.
9.1. OS별 TCP 스택 구현
9.1. OS별 TCP 스택 구현
주요 운영체제의 TCP/IP 스택은 표준 TCP 혼잡 제어 알고리즘을 구현하지만, 구현 세부사항과 기본 알고리즘 선택, 튜닝 가능한 파라미터에 차이가 있습니다.
리눅스 커널의 TCP 스택은 매우 다양한 혼잡 제어 알고리즘을 모듈 형태로 제공합니다. 기본 알고리즘은 역사적으로 CUBIC이지만, 최근 커널 버전에서는 BBR이 점차 표준으로 자리 잡고 있습니다. sysctl 명령어를 통해 /proc/sys/net/ipv4/tcp_congestion_control 값을 변경하여 알고리즘을 선택할 수 있습니다. 사용 가능한 알고리즘 목록은 /proc/sys/net/ipv4/tcp_available_congestion_control에서 확인할 수 있습니다. 리눅스는 또한 TCP 윈도우 스케일링, 타임스탬프 옵션 등 다양한 최적화 옵션을 활성화하고 있습니다.
마이크로소프트 윈도우의 TCP 구현은 버전에 따라 진화해 왔습니다. 윈도우 10 및 윈도우 서버 2016 이후부터는 기본 혼잡 제어 알고리즘이 CUBIC으로 설정되어 있습니다. 이전 버전(윈도우 7, 윈도우 서버 2008 R2 등)은 NewReno를 기본으로 사용했습니다. 윈도우에서는 netsh interface tcp show global 명령어를 통해 현재의 혼잡 제어 공급자를 확인하고, netsh interface tcp set global congestionprovider= 명령으로 변경할 수 있습니다. 윈도우는 또한 CTCP(Compound TCP)라는 자체 알고리즘도 제공합니다.
BSD 계열 운영체제, 특히 FreeBSD와 macOS의 TCP 스택은 역사적으로 NewReno 알고리즘을 기반으로 합니다. FreeBSD는 다양한 알고리즘을 커널 모듈로 지원하며, sysctl net.inet.tcp.cc.algorithm을 통해 변경이 가능합니다. 최신 버전의 macOS도 비슷한 메커니즘을 제공합니다.
운영체제 | 기본 알고리즘 (최신) | 주요 대체 알고리즘 | 설정 방법 |
|---|---|---|---|
리눅스 | CUBIC (또는 BBR) | BBR, Reno, Vegas, DCTCP 등 | sysctl ( |
윈도우 (10+) | CUBIC | NewReno, CTCP | netsh 명령어 |
FreeBSD / macOS | NewReno | CUBIC, Vegas, HTCP 등 | sysctl ( |
이러한 구현 차이는 네트워크 성능과 동작에 직접적인 영향을 미칩니다. 따라서 특정 애플리케이션 또는 네트워크 환경에 최적화하기 위해 운영체제별 TCP 파라미터를 튜닝하는 경우가 많습니다. 예를 들어, 데이터센터 내 저지연 네트워크에서는 DCTCP(Data Center TCP)를, 고대역폭 장거리 링크에서는 BBR이나 CUBIC을 명시적으로 선택하는 것이 일반적입니다.
9.2. 튜닝 파라미터와 설정
9.2. 튜닝 파라미터와 설정
TCP 혼잡 제어 알고리즘의 동작은 운영 체제 커널 내 TCP 스택의 여러 튜닝 가능한 파라미터에 의해 세부적으로 조절된다. 이러한 파라미터는 네트워크 환경, 애플리케이션 특성, 운영 정책에 맞춰 시스템 관리자가 최적화할 수 있다. 주요 파라미터로는 초기 혼잡 윈도우(Initial Congestion Window, initcwnd), 수신 윈도우 크기, RTT 샘플링 관련 값, 그리고 특정 알고리즘(예: TCP CUBIC, BBR) 전용 변수 등이 있다.
일반적인 튜닝 항목은 다음과 같다.
파라미터 (예시) | 설명 | 영향 |
|---|---|---|
| 초기 혼잡 윈도우 크기 (세그먼트 단위). 연결 시작 시 사용 가능한 데이터 양을 결정한다. | 짧은 연결(Short-lived flow)의 성능에 큰 영향을 미친다. 값이 너무 크면 초기 혼잡을 유발할 수 있다. |
| 각각 수신 및 송신 소켓 버퍼의 최소, 기본, 최대 크기(바이트 단위)를 정의한다. | 버퍼가 너무 작으면 대역폭을 충분히 활용하지 못하고, 너무 크면 불필요한 메모리 사용과 큐잉 지연을 초래할 수 있다. |
| 사용할 기본 혼잡 제어 알고리즘을 선택한다 (예: | 네트워크 특성(고대역폭·장지연 등)에 맞는 알고리즘 선택이 전체 처리량과 지연에 결정적이다. |
| 유휴 상태 후 느린 시작 단계를 다시 시작할지 여부를 제어한다. | 장시간 유휴 후의 연결 재활성화 속도에 영향을 준다. |
파라미터 설정은 주로 리눅스 시스템의 sysctl 명령어를 통해 이루어지며, 설정은 시스템 전역 또는 특정 소켓 수준에서 적용될 수 있다. 예를 들어, 초기 혼잡 윈도우를 10개 세그먼트로 설정하려면 sysctl -w net.ipv4.tcp_initcwnd=10 명령을 사용한다. 최적의 값은 네트워크의 대역폭 지연 곱, 패킷 손실률, 동시 연결 수 등을 고려하여 실험적으로 결정해야 한다. 잘못된 튜닝은 네트워크 공정성을 해치거나 혼잡을 악화시킬 수 있으므로 주의가 필요하다.
